package red;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;


public class TestRadomPkg {

	public static void main(String[] args) {
		
//		List<RandomRedPkgRo> randomRedPkg = getRandomRedPkg(5,0.00000675,7);
//		List<RandomRedPkgRo> randomRedPkg = getRandomRedPkg(5,100000000.00000001,5);
		List<RandomRedPkgRo> randomRedPkg = getRandomRedPkg(1,1000000000.00000001,5);
		BigDecimal sum = BigDecimal.ZERO ;
		for (RandomRedPkgRo randomRedPkgRo : randomRedPkg) {
			System.out.println(" randomRedPkgRo :"+randomRedPkgRo);
			
			sum = sum.add(randomRedPkgRo.getAmount());
		}
		System.out.println(sum.toPlainString());
		System.out.println("----------------------------------");
		
		
		BigDecimal bbd = new BigDecimal("1000000000.00000001");
		
		List<RandomRedPkgRo> randomRedPkg1 = getRandomRedPkg(100000,bbd,5);
		
		BigDecimal sum1 = BigDecimal.ZERO ;
		for (RandomRedPkgRo randomRedPkgRo : randomRedPkg1) {
			System.out.println(" randomRedPkgRo :"+randomRedPkgRo);
			
			sum1 = sum1.add(randomRedPkgRo.getAmount());
		}
		System.out.println(sum1.toPlainString());
		
	}
	
	/**
	 * 生成随机红包
	 * @param n
	 * @param money
	 * @param deci
	 * @return
	 */
	private static  List<RandomRedPkgRo> getRandomRedPkg(int n, double money,int coinId){
		int deci = 8;
		if(coinId == 8) deci = 2;
		List<RandomRedPkgRo> radndomRos = new ArrayList<>();
		List<Double> math = new ArrayList<>();
		double multiPower = 100000000d;
		if (deci == 2) multiPower = 100d;
		money = BigDecimalUtil.mul(money, multiPower);
		double[] result = new double[n];
		double[] randNumber = new double[n];
		double randSum = 0d; // 随机数和
		double allocateSum = BigDecimalUtil.sub(money, Double.parseDouble(n + "")); // 扣除每人最低分配金额后再分配
		if(allocateSum == 0){
			if(deci==2){
				RandomRedPkgRo roOne = new RandomRedPkgRo(new BigDecimal("0.01"));
				radndomRos.add(roOne);
				roOne.setLuck(true);
				for(int i=0;i<n-1;i++){
					RandomRedPkgRo ro = new RandomRedPkgRo(new BigDecimal("0.01"));
					radndomRos.add(ro);
				}
			}else{
				RandomRedPkgRo roOne = new RandomRedPkgRo(new BigDecimal("0.00000001"));
				radndomRos.add(roOne);
				roOne.setLuck(true);
				for(int i=0;i<n-1;i++){
					RandomRedPkgRo ro = new RandomRedPkgRo(new BigDecimal("0.00000001"));
					radndomRos.add(ro);
				}
			}
			return radndomRos;
		}
		for (int i = 0; i < randNumber.length; i++) {
			randNumber[i] = BigDecimalUtil.mul(Math.random(), allocateSum); // 生成随机数
			randSum = BigDecimalUtil.sum(randSum, randNumber[i]);
		}
		double left = allocateSum;
		for (int i = 0; i < result.length - 1; i++) {
			result[i] = Math.round(BigDecimalUtil.mul(BigDecimalUtil.div(randNumber[i], randSum, deci), allocateSum));
			left = BigDecimalUtil.sub(left, result[i]);
			result[i] = BigDecimalUtil.div(BigDecimalUtil.sum(result[i], 1), multiPower, deci);// 把最低金额加回去
			math.add(result[i]);
		}
		result[n - 1] = BigDecimalUtil.div(BigDecimalUtil.sum(left, 1), multiPower, deci, BigDecimal.ROUND_DOWN);
		math.add(result[n-1]);
		int luckIndex = math.indexOf(Collections.max(math));
		for (int j = 0; j < math.size(); j++) {
			RandomRedPkgRo randomRedPkgRo = new RandomRedPkgRo(new BigDecimal(math.get(j) + ""));
			if (j == luckIndex)
				randomRedPkgRo.setLuck(true);
			radndomRos.add(randomRedPkgRo);
		}
		return radndomRos;
	}
	
	
	/**
	 * 生成随机红包
	 * @param n
	 * @param money
	 * @param deci
	 * @return
	 */
	private static  List<RandomRedPkgRo> getRandomRedPkg(int n, BigDecimal money,int coinId){
		int deci = 8;
		if(coinId == 8) deci = 2;
		List<RandomRedPkgRo> radndomRos = new ArrayList<>();
		List<BigDecimal> math = new ArrayList<>();
		BigDecimal multiPower = new BigDecimal("100000000");
		if (deci == 2) multiPower = new BigDecimal("100");;
		money = BigDecimalUtil.mul(money, multiPower);
		
		BigDecimal [] result = new BigDecimal[n];
		BigDecimal [] randNumber = new BigDecimal[n];
		BigDecimal randSum = BigDecimal.ZERO;
		BigDecimal allocateSum = BigDecimalUtil.sub(money, new BigDecimal(n + "")); // 扣除每人最低分配金额后再分配
		
		
		if(BigDecimal.ZERO.compareTo(allocateSum)==0){
			if(deci==2){
				RandomRedPkgRo roOne = new RandomRedPkgRo(new BigDecimal("0.01"));
				radndomRos.add(roOne);
				roOne.setLuck(true);
				for(int i=0;i<n-1;i++){
					RandomRedPkgRo ro = new RandomRedPkgRo(new BigDecimal("0.01"));
					radndomRos.add(ro);
				}
			}else{
				RandomRedPkgRo roOne = new RandomRedPkgRo(new BigDecimal("0.00000001"));
				radndomRos.add(roOne);
				roOne.setLuck(true);
				for(int i=0;i<n-1;i++){
					RandomRedPkgRo ro = new RandomRedPkgRo(new BigDecimal("0.00000001"));
					radndomRos.add(ro);
				}
			}
			return radndomRos;
		}
		for (int i = 0; i < randNumber.length; i++) {
			randNumber[i] = BigDecimalUtil.mul(Math.random(), allocateSum); // 生成随机数
			randSum = BigDecimalUtil.sum(randSum, randNumber[i]);
		}
		BigDecimal left = allocateSum;
		for (int i = 0; i < result.length - 1; i++) {
			BigDecimal mul = BigDecimalUtil.mul(BigDecimalUtil.div(randNumber[i], randSum, deci), allocateSum);
			result[i] = BigDecimal.valueOf(Math.round(mul.doubleValue()));
			left = BigDecimalUtil.sub(left, result[i]);
			result[i] = BigDecimalUtil.div(BigDecimalUtil.sum(result[i], BigDecimal.valueOf(1)), multiPower, deci);// 把最低金额加回去
			math.add(result[i]);
		}
		result[n - 1] = BigDecimalUtil.div(BigDecimalUtil.sum(left, BigDecimal.valueOf(1)), multiPower, deci, BigDecimal.ROUND_DOWN);
		math.add(result[n-1]);
		int luckIndex = math.indexOf(Collections.max(math));
		for (int j = 0; j < math.size(); j++) {
			RandomRedPkgRo randomRedPkgRo = new RandomRedPkgRo(new BigDecimal(math.get(j) + ""));
			if (j == luckIndex)
				randomRedPkgRo.setLuck(true);
			radndomRos.add(randomRedPkgRo);
		}
		return radndomRos;
	}
	
	/**
	 * 生成随机红包
	 * @param n
	 * @param money
	 * @param deci
	 * @return
	 */
	private  List<RandomRedPkgRo> getRandomRedPkg1(int n, BigDecimal money,int coinId){
		BigDecimal lastMoney = money; //最后一个用减
		int deci = 8;
		if(coinId == 8) deci = 2;
		List<RandomRedPkgRo> radndomRos = new ArrayList<>();
		List<BigDecimal> math = new ArrayList<>();
		BigDecimal multiPower = new BigDecimal("100000000");
		if (deci == 2) multiPower = new BigDecimal("100");;
		money = BigDecimalUtil.mul(money, multiPower);
		
		BigDecimal [] result = new BigDecimal[n];
		BigDecimal [] randNumber = new BigDecimal[n];
		BigDecimal randSum = BigDecimal.ZERO;
		BigDecimal allocateSum = BigDecimalUtil.sub(money, new BigDecimal(n + "")); // 扣除每人最低分配金额后再分配
		
		
		if(BigDecimal.ZERO.compareTo(allocateSum)==0){
			if(deci==2){
				RandomRedPkgRo roOne = new RandomRedPkgRo(new BigDecimal("0.01"));
				radndomRos.add(roOne);
				roOne.setLuck(true);
				for(int i=0;i<n-1;i++){
					RandomRedPkgRo ro = new RandomRedPkgRo(new BigDecimal("0.01"));
					radndomRos.add(ro);
				}
			}else{
				RandomRedPkgRo roOne = new RandomRedPkgRo(new BigDecimal("0.00000001"));
				radndomRos.add(roOne);
				roOne.setLuck(true);
				for(int i=0;i<n-1;i++){
					RandomRedPkgRo ro = new RandomRedPkgRo(new BigDecimal("0.00000001"));
					radndomRos.add(ro);
				}
			}
			return radndomRos;
		}
		for (int i = 0; i < randNumber.length; i++) {
			randNumber[i] = BigDecimalUtil.mul(Math.random(), allocateSum); // 生成随机数
			randSum = BigDecimalUtil.sum(randSum, randNumber[i]);
		}
		for (int i = 0; i < result.length - 1; i++) {
			BigDecimal mul = BigDecimalUtil.mul(BigDecimalUtil.div(randNumber[i], randSum, deci), allocateSum);
			result[i]  = mul.setScale(0,RoundingMode.DOWN);
			result[i] = BigDecimalUtil.div(BigDecimalUtil.sum(result[i], BigDecimal.valueOf(1)), multiPower, deci);// 把最低金额加回去
			math.add(result[i]);
			lastMoney = lastMoney.subtract(result[i]);
		}
		math.add(lastMoney);
		int luckIndex = math.indexOf(Collections.max(math));
		for (int j = 0; j < math.size(); j++) {
			RandomRedPkgRo randomRedPkgRo = new RandomRedPkgRo(new BigDecimal(math.get(j) + ""));
			if (j == luckIndex)
				randomRedPkgRo.setLuck(true);
			radndomRos.add(randomRedPkgRo);
		}
		return radndomRos;
	}
}
